package collectionFrame;

import java.util.*;

public class Demo6_LinkedList {

    /**
     * 1.测试
     *   在向一个ArrayList中插入特别多次的元素的时候，执行的时间明显变慢
     *   原因是因为底层结构是数组，每插入一个元素，后面的所有元素都必须向后移位，浪费了大量的时间
     *   ArrayList 不适合做插入操作(向后追加除外)
     * 2.解决
     *   思路：改变一种底层的结构，让插入数据的时候对其他元素没有任何影响
     *   方法：可以使用链表结构替换掉原来的数组结构
     *   什么是链表：一环扣一环，如需添加元素的时候，把相应位置的链断开，与新元素重新连接形成新链，不会对其他元素产生影响
     * 3.LinkedList
     *   是一个链表结构的列表
     *   用Node表示每个元素
     *     每个Node中都有一个前驱一个后继还有当前元素值
     *     前驱连接上一个节点的后继，后继连接下一个节点的前驱
     *     如果前驱为null，此节点为头节点，如果后继为null，此节点为尾节点
     *   源码
     * 4.Queue - Deque - LinkedList
     *   列表的特点是两端相通的，先进先出(FIFO)
     *   Queue是单向队列，只能对某一端的元素进行操作
     *   Deque是双向队列，对头和尾元素都可以操作
     * 5.Stack
     *   栈的特点是一端是封死的，只有另一端开口，后进先出(FILO)
     */

    public static void testList(){
        List<Integer> list_nums = new LinkedList<>();

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list_nums.add(0,i);
        }
        long endTime = System.currentTimeMillis();

        System.out.println(startTime);
        System.out.println(endTime);
        System.out.println(endTime-startTime);
    }


    public static void testArrayDeque(){

        ArrayDeque<Integer> deque_nums = new ArrayDeque<>();

//        deque_nums.addFirst(1);
//        deque_nums.addFirst(2);
//        deque_nums.addFirst(3);
//        deque_nums.addLast(4);
//        deque_nums.addLast(4);
//        deque_nums.addLast(5);
//        deque_nums.add(6);
//
//        deque_nums.removeFirst();
//        deque_nums.removeLast();
//
//        System.out.println(deque_nums);
//
//        System.out.println(deque_nums.peekFirst());
//        System.out.println(deque_nums.peekLast());

//        deque_nums.removeFirst();
//        System.out.println(deque_nums.pollFirst());

//        System.out.println(deque_nums.element());
//        System.out.println(deque_nums.peek());

    }

    public static void testStack(){
        Stack<Integer> stack = new Stack<>();
        //向栈中添加值，也叫做压栈
        stack.push(1);
        stack.push(2);
        stack.push(3);

        //从栈中删除元素，也叫做出栈
        System.out.println(stack.pop());

        //查找栈中的最上面的元素
        System.out.println(stack.peek());

        System.out.println(stack);
    }

    public static void main(String[] args) {
//        Demo6_LinkedList.testList();
//        Demo6_LinkedList.testArrayDeque();
        Demo6_LinkedList.testStack();
    }

}
